package mvc.handlers;

import facade.DocenteFacadeRemote;
import facade.SegreteriaFacadeRemote;
import facade.StudenteFacadeRemote;
import util.InterfaceUtente;

import mvc.framework.*;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 * Handler per gestire l'azione di login al sistema
 * 
 * @author Grillo
 */
public class LoginHandler extends AbsRequestHandler {

    //costanti di errore
    public final static int ERR_LOGIN = 1;
    public final static int ERR_MISSED_FIELD = 2;

    private final static String ACTION_NAME = "login";

    public LoginHandler(DialogHandler dHandler) {
        super(dHandler);

        //Aggiungo la descrizione degli errori
        errors.add("Utente non conosciuto o password errata");
        errors.add("Matricola o password non inserita");
    }

    public String getActionName() {
        return ACTION_NAME;
    }

    public void setNextPage() {
        nextPage = "/views/home.jsp";
    }
    
    public int validate() {
        //controllo che i campi sono impostati
        String mat = dialogHandler.getParameter("matricola");
        String pwd = dialogHandler.getParameter("password");
        if(mat!=null && !mat.equals("") && pwd!=null && !pwd.equals(""))
            return SUCCESS;
        else
            return ERR_MISSED_FIELD;
    }

    public int execute() {
        String tipo = "";
        Integer mat = 0;
        String pwd = dialogHandler.getParameter("password");
        DocenteFacadeRemote docenteFacade = null;
        SegreteriaFacadeRemote segreteriaFacade = null;
        StudenteFacadeRemote studenteFacade = null;

        try {
            tipo = dialogHandler.getParameter("matricola").substring(0,2);
            mat = Integer.parseInt(dialogHandler.getParameter("matricola").substring(2));
        } catch(Exception e) {}

        //Bind agli EJB
        try {
            Context c = new InitialContext();
            docenteFacade = (DocenteFacadeRemote) c.lookup("facade.DocenteFacadeRemote");
            segreteriaFacade = (SegreteriaFacadeRemote) c.lookup("facade.SegreteriaFacadeRemote");
            studenteFacade = (StudenteFacadeRemote) c.lookup("facade.StudenteFacadeRemote");
        } catch (NamingException ne) {}

        InterfaceUtente user = null;
        //login studente
        if(tipo.equalsIgnoreCase("st")) {
            user = studenteFacade.login(mat, pwd);
            if(user != null) {
                //login effettuato con successo, inizializzare la sessione studente
                SessionManager.setAttribute(dialogHandler.getSession(), "tipo_utente", "STUDENTE");
            }
        }
        //login docente
        if(tipo.equalsIgnoreCase("do")) {
            user = docenteFacade.login(mat, pwd);
            if(user != null)
                SessionManager.setAttribute(dialogHandler.getSession(), "tipo_utente", "DOCENTE");
        }
        //login segreteria
        if(tipo.equalsIgnoreCase("se")) {
            user = segreteriaFacade.login(mat, pwd);
            if(user != null)
                SessionManager.setAttribute(dialogHandler.getSession(), "tipo_utente", "SEGRETERIA");
        }
        if(user == null)
            return ERR_LOGIN;

        SessionManager.setAttribute(dialogHandler.getSession(), "utente", user);
        return SUCCESS;
    }

    @Override
    public IRequestHandler clone(DialogHandler dHandler) throws CloneNotSupportedException {
        return new LoginHandler(dHandler);
    } 
}